#!/bin/bash
###############################################################################
#       脚本名称: formatter_json.sh
#       功能描述: JSON格式化器,将日志事件格式化为JSON格式
#       作者: 林再来
#       日期: 2025-10-14
#       版本: 1.0
#       功能:
#           1、将日志事件格式化为标准JSON格式
#           2、支持单行JSON输出(便于日志分析)
#           3、支持美化输出(便于人类阅读)
#           4、支持字段过滤和重命名
#       依赖(插件/命令):
#           无(使用纯shell实现)
###############################################################################

# 防止重复加载
[[ -n "${_FORMATTER_JSON_LOADED:-}" ]] && return 0
readonly _FORMATTER_JSON_LOADED=1

#-----------------------------------------------------------------------------
# 函数: JSON转义特殊字符
# 参数: $1 - 需要转义的字符串
# 返回: 输出转义后的字符串
#-----------------------------------------------------------------------------
function _json_escape() {
    local str="$1"
    
    # 转义反斜杠
    str="${str//\\/\\\\}"
    # 转义双引号
    str="${str//\"/\\\"}"
    # 转义换行符
    str="${str//$'\n'/\\n}"
    # 转义回车符
    str="${str//$'\r'/\\r}"
    # 转义制表符
    str="${str//$'\t'/\\t}"
    
    echo "$str"
}

#-----------------------------------------------------------------------------
# 函数: 格式化日志事件为JSON
# 参数: $1 - 事件JSON字符串(已经是JSON格式)
#       $2 - 是否美化输出(true/false,可选,默认false)
# 返回: 输出格式化后的JSON字符串
# 说明: 由于输入已经是JSON,这里主要是美化或重新组织字段
#-----------------------------------------------------------------------------
function _formatter_json_format() {
    local event="$1"
    local pretty="${2:-false}"
    
    # 如果需要美化输出,使用jq(如果可用)
    if [[ "$pretty" == "true" ]] && command -v jq &>/dev/null; then
        echo "$event" | jq '.'
        return 0
    fi
    
    # 否则直接输出压缩的JSON(单行)
    # 移除多余的空格和换行
    echo "$event" | tr -d '\n' | sed 's/  */ /g'
}

#-----------------------------------------------------------------------------
# 函数: 从字段构建JSON(备用方法)
# 参数: 通过关联数组传递字段
# 返回: 输出JSON字符串
#-----------------------------------------------------------------------------
function _formatter_json_build() {
    local -n fields=$1  # 引用关联数组
    local json="{"
    local first=true
    
    for key in "${!fields[@]}"; do
        if [[ "$first" == true ]]; then
            first=false
        else
            json+=","
        fi
        
        local value=$(_json_escape "${fields[$key]}")
        json+="\"$key\":\"$value\""
    done
    
    json+="}"
    echo "$json"
}

#-----------------------------------------------------------------------------
# 函数: 对外接口 - 格式化为JSON
# 参数: $1 - 事件JSON字符串
#       $2 - 格式化器名称(用于获取配置)
# 返回: 输出格式化后的JSON
#-----------------------------------------------------------------------------
function formatter_json_format() {
    local event="$1"
    local formatter_name="${2:-json}"
    
    # TODO: 从配置中获取pretty设置
    local pretty="false"
    
    _formatter_json_format "$event" "$pretty"
}

#-----------------------------------------------------------------------------
# 函数: 添加额外字段到JSON
# 参数: $1 - 原JSON字符串
#       $2 - 字段名
#       $3 - 字段值
# 返回: 输出新的JSON字符串
#-----------------------------------------------------------------------------
function _formatter_json_add_field() {
    local json="$1"
    local field_name="$2"
    local field_value="$3"
    
    # 移除结尾的}
    json="${json%\}}"
    
    # 如果JSON不为空(不是只有{),添加逗号
    if [[ "$json" != "{" ]]; then
        json+=","
    fi
    
    # 添加新字段
    field_value=$(_json_escape "$field_value")
    json+="\"$field_name\":\"$field_value\"}"
    
    echo "$json"
}

#-----------------------------------------------------------------------------
# 测试函数
#-----------------------------------------------------------------------------
function _formatter_json_test() {
    echo "=== JSON格式化器测试 ==="
    
    # 构造测试事件
    local test_event
    test_event=$(cat <<'EOF'
{
"timestamp": "2025-10-14 15:30:45",
"level": "INFO",
"message": "用户登录成功: user_id=123",
"module": "auth",
"script": "login.sh",
"line": "123",
"function": "do_login",
"trace_id": "req-12345",
"hostname": "server01",
"username": "admin",
"pid": "9876"
}
EOF
)
    
    echo "1. 单行JSON格式测试:"
    _formatter_json_format "$test_event" "false"
    
    echo ""
    echo "2. 美化JSON格式测试(如果jq可用):"
    if command -v jq &>/dev/null; then
        _formatter_json_format "$test_event" "true"
    else
        echo "  (jq未安装,跳过美化测试)"
    fi
    
    echo ""
    echo "3. JSON转义测试:"
    local test_str='包含"双引号"和\反斜杠\和换行符
的字符串'
    echo "  原始: $test_str"
    echo "  转义: $(_json_escape "$test_str")"
    
    echo ""
    echo "4. 从字段构建JSON测试:"
    declare -A test_fields=(
        ["timestamp"]="2025-10-14 15:30:45"
        ["level"]="ERROR"
        ["message"]="数据库连接失败"
    )
    echo "  $(_formatter_json_build test_fields)"
    
    echo ""
    echo "5. 添加字段测试:"
    local simple_json='{"level":"INFO","message":"测试消息"}'
    echo "  原始: $simple_json"
    simple_json=$(_formatter_json_add_field "$simple_json" "new_field" "new_value")
    echo "  添加后: $simple_json"
}

# 如果直接执行此脚本,运行测试
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    _formatter_json_test
fi

